package com.ctshk.rpc.goods.service;

import com.alibaba.fastjson.JSONObject;
import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.goods.CommoditySeasonDTO;
import com.ctshk.rpc.goods.dto.CommodityDTO;
import com.ctshk.rpc.goods.dto.CommodityOrderDetailsDTO;
import com.ctshk.rpc.goods.dto.CommodityPageDTO;
import com.ctshk.rpc.goods.dto.resp.CountVo;
import com.ctshk.rpc.goods.req.CommodityAddReq;
import com.ctshk.rpc.goods.req.CommodityApprovalProcessReq;
import com.ctshk.rpc.goods.req.CommodityPageReq;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 商品表 服务类
 * </p>
 *
 * @author 姜斌文
 * @since 2021-04-13
 */
public interface ICommodityService {

    /**
     * 新增商品
     * @param addReq 商品入参对象
     * @param currentUser 用户
     * @throws Exception 異常
     */
    void addCommodity(CommodityAddReq addReq, TokenUser currentUser) throws Exception;

    /**
     * 編輯商品
     * @param addReq 商品入参对象
     * @param userId 用户ID
     * @throws Exception 異常
     */
    void updateCommodity(CommodityAddReq addReq, Long userId) throws Exception;

    /**
     * 分页查询商品统计列表
     * @param pageReq  分页条件入参
     * @param currentUser  登录用户
     * @return 分页列表数据
     */
    PageResponse<CommodityPageDTO> findCommodityPageList(CommodityPageReq pageReq, TokenUser currentUser);

    /**
     * 根据商品ID查询明细
     * @param id 商品ID
     * @return CommodityDTO
     */
    Result<CommodityDTO> findCommodityById(Long id);

    /**
     * 根据商品ID查询明细
     * @param id 商品ID
     * @param userId 用户ID
     * @return CommodityDTO
     */
    Result<CommodityDTO> findPcCommodityById(Long id, Long userId, LocalDateTime now);

    /**
     * 根據ID更新商品上下架狀態
     * @param id 商品主鍵ID
     * @param saleStatus 更新狀態：售卖状态：1：上架；2：下架
     * @param tokenUser 用户对象
     */
    void updateCommodityStatusById(Long id, Integer saleStatus, TokenUser tokenUser);

    /**
     * 商品审批-状态更新
     * @param approvalProcessReq 商品审批流程参数
     * @param tokenUser 用户对象
     * @throws Exception 异常
     */
    void commodityApprovalProcess(CommodityApprovalProcessReq approvalProcessReq, TokenUser tokenUser) throws Exception;

    /**
     * 门店订单功能-商品详情页查询，目前只根据页面所需，返回了相应的数据结构体
     * @param id 商品ID
     * @param userId 用户ID
     * @return CommodityDTO
     */
    Result<CommodityOrderDetailsDTO> findCommodityOrderDetailsById(Long id, Long userId);

    List<CommodityDTO> selectCommodityDTOListByIds(List<Long> ids);

    List<CountVo> findSavenDaysCommodityNumber();

    /**
     * 获取商品成本价
     * @param commodityId 商品id
     * @param currentDateTime 当天日期
     * @param specificationsAttributeOneId 属性1 id
     * @param specificationsAttributeTwoId 属性2 id
     * @return
     */
    Result<CommoditySeasonDTO> findCommodityPriceById(Long commodityId, LocalDate currentDateTime, Long specificationsAttributeOneId, Long specificationsAttributeTwoId);

    /**
     * 根据商品ID查询订购信息
     * @param id
     * @return
     */
    JSONObject findCommodityAttributesListById(Long id);

}
